// request.js
import * as Url from "../net/Url.js";
import * as Constants from "@/common/Constants";

const BASE_URL = Url.HOST; // 设置基础URL

/**
 * 网络请求
 */
function request(options) {
    // 默认配置
    const defaultOptions = {
        url: '', // 请求地址
        method: 'GET', // 请求方法
        data: {}, // 请求数据
        header: {
            'content-type': 'application/json', // 默认请求头     'application/x-www-form-urlencoded' 'application/json;charset=utf-8' 'application/json' 'multipart/form-data'
            'source': 'APP',//请求来源
        },
        timeout: 30000,
    };

    // 合并用户传入的配置与默认配置
    let config = Object.assign({}, defaultOptions, options);

    // 拼接完整url
    if (!config.url.startsWith('http')) {
        config.url = BASE_URL + config.url;
    }

    // 如果存在token，添加到header中
    let token = uni.getStorageSync(Constants.TOKEN);
    if (token) {
        config.header['Authorization'] = `Bearer ${token}`;
    }

    return new Promise((resolve, reject) => {
        // 先检测网络
        getNetwork().then(res => {
            // 发送请求
            uni.request({
                ...config,
                success(res) {
                    resolve(reponseStatus(res))
                },
                fail(err) {
                    // 请求失败处理
                    reject(`请求失败：${err.errMsg}`);
                }
            });
        }).catch(err => {
            reject(err)
        })
    });
}

/**
 * 响应拦截处理
 */
const reponseStatus = (res) => {
    return new Promise((resolve, reject) => {
        switch (res.data.code) {
            case 200:
                resolve(res.data)
                break;
            case 400:
                reject()
                console.error('400错误:' + res.data.msg)
                break;
            case 401:
                // uni.removeStorageSync("token")
                // setTimeout(() => {
                //     SwitchTo('/pages/Home/home')
                // }, 1000)
                reject()
                console.error('401错误:' + res.data.msg)
                break;
            case 404:
                reject()
                console.error('404未找到目标报错:' + res.data.msg)
                break;
            case 500:
                reject()
                console.error('500服务器报错:' + res.data.msg)
                break;
            default:
                reject(res.data)
                console.error(`状态码${res.data.code}: 未知得错误`)
        }
    })
}

/**
 * 检查网络状态
 */
const getNetwork = () => {
    return new Promise((resolve, reject) => {
        uni.getNetworkType({
            success: (res) => {
                if (res.networkType !== 'none') {
                    resolve('')
                } else {
                    reject('网络未连接');

                    //TODO 跳转网络页面
                    // uni.navigateTo({
                    //     url: '/pages/netWork/netWork'
                    // })
                }
            },
            fail: (err) => {
                reject(err);
                //TODO 跳转网络页面
                // uni.navigateTo({
                //     url: '/pages/netWork/netWork'
                // })
                // this.$API(proxy).Toast('请查看当前网络连接是否正常', 'error')
            }
        });
    })
}

export default request;